package com.hsh.MySQLUtil.util;

import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hsh.MySQLUtil.annotation.Wrapper;
import com.hsh.MySQLUtil.enmu.Comparison;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

/**
 * @author 初心
 * @date 2023/7/27 19:58
 */
public class QueryWrapperBuilder {
    public static <T> QueryWrapper<T> buildQueryWrapper(T t) {
        QueryWrapper<T> wrapper = new QueryWrapper<T>();
        if (t == null) {
            return wrapper;
        }
        //hutool包装的方法,获得一个类中所有字段列表,包括其父类中的字段和私有字段
        //相当于getDeclaredFields()和getFields()的结合体
        Field[] fields = ReflectUtil.getFields(t.getClass());
        List<Field> list = Arrays.asList(fields);
        if (list.isEmpty()) {
            return wrapper;
        }
        for (Field field : list) {
            //hutool包装的方法，与field.get(t)类似，但不需要try/catch
            Object value = ReflectUtil.getFieldValue(t, field.getName());
            //字段值为空时不参与条件查询
            if (value == null || "".equals(value)) {
                continue;
            }
            //允许访问私有字段
            field.setAccessible(true);
            //获取Wrapper注解
            Wrapper wrapperAnno = field.getAnnotation(Wrapper.class);
            if (wrapperAnno == null) {
                continue;
            }
            //设置该字段对应数据库的列名,默认字段名=列名
            String name = wrapperAnno.column().isEmpty()
                    ? field.getName()
                    : wrapperAnno.column();
            //根据注解的值添加对应的属性
            switch (wrapperAnno.value()) {
                case EQ:
                    wrapper.eq(name, value);
                    break;
                case LT:
                    wrapper.lt(name, value);
                    break;
                case GT:
                    wrapper.gt(name, value);
                    break;
            }
        }
        return wrapper;
    }
}
